拓扑排序 【Kahn算法】时间复杂度 V*V + E (个人认为)

 

Ordering Tasks

 UVA - 10305  下面的代码也是这道题的题解:

 

#include<cstdio>
#include<map>
#include<queue>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<iostream>
using namespace std;

#define Maxn 110
int dge[Maxn],G[Maxn][Maxn]; // 分别为 一个顶点的入度,和一个邻接图G

int main(void)
{
    //freopen("in.txt","r",stdin);
   // freopen("out.txt","w",stdout);
    int n,m;
    while(cin >> n >> m) {
        if(n == 0 && m == 0) break;
        memset(dge,0,sizeof(dge));
        memset(G,0,sizeof(G));
        int tmp,tp;
        for(int i = 1 ; i <= m ; ++i) {
            cin >> tmp >> tp;
            G[tmp][tp] = 1;  // tmp->tp 标记为 1
            dge[tp]++;  // tp的入度 + 1
        }
        queue<int> qu;  
        // 把入度为 0 的顶点放进 队列中
        for(int i = 1 ; i <= n ; ++i)  if(!dge[i]) qu.push(i);
        while(!qu.empty()) {
            int v = qu.front();
            qu.pop();
            // 一个一个地弹出入度为 0 的顶点
            cout << v;
            // 判断这个顶点有没有与其他顶点有边,如果有,则这个顶点的入度 - 1 
            // 如果入度 为 0 ,则把这个顶底继续放进队列中,直到队列为空
            for(int i = 1 ; i <= n ; ++i) if(G[v][i]) { dge[i]--; if(!dge[i]) qu.push(i); }
            if(!qu.empty()) cout << " "; else cout << endl;
        }
        //如果队列为空,仍有顶点入度不为0,则说明有环
    }
    return 0;
}

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值